package orb.interoperabilidade;

import orb.aplicacao.Codec;
import orb.transporte.Buffer;
import orb.transporte.TCPTransport;
import sun.security.jca.GetInstance;
import util.Constantes;

public class PDU {
	private static Buffer buf;
	private static Codec codec;
	private static String operacao;
	private static Object[] parametros;
	private static String tipoMensagem = Constantes.request;
	
	private TCPTransport tcp = new TCPTransport();

	
	public void setTcp(TCPTransport tcp) {
		this.tcp = tcp;
	}
	public Buffer getBuf() {
		return buf;
	}
	public void setBuf(Buffer buf) {
		this.buf = buf;
	}
	public static Codec getCodec() {
		return codec;
	}
	public static void setCodec(Codec codec) {
		PDU.codec = codec;
	}
	public static String getTipoMensagem() {
		return tipoMensagem;
	}
	public static void setTipoMensagem(String s){
		PDU.tipoMensagem = s;
	}
	public static String getOperacao() {
		return operacao;
	}
	public static void setOperacao(String operacao) {
		PDU.operacao = operacao;
	}
	public static Object[] getParametros() {
		return parametros;
	}
	public static void setParametros(Object[] parametros) {
		PDU.parametros = parametros;
	}
	
	
	
	
	public void send(){
		
		PDU.buf = new Buffer();
		PDU.codec = new Codec();
		
		if(PDU.tipoMensagem.equals(Constantes.request)){
			PDU.buf = Cabecalho.putRequestHeader(buf, PDU.operacao);
			PDU.codec.setBuffer(PDU.buf);
			PDU.codec.putRequestBody(PDU.parametros);
		}else{
			PDU.buf = Cabecalho.putResponseHeader(buf);
			PDU.codec.setBuffer(PDU.buf);
			PDU.codec.putResponseBody(PDU.parametros);
		}
		
		this.tcp.send(PDU.buf);
	}
	
	public Object[] recieve(){
		this.codec = new Codec();
		Object[] retorno = null;
		Buffer temp = this.tcp.recieve();
		
		byte[] teste = temp.getData();
		byte[] bool = new byte[1];
		bool[0] = teste[9];
		String s = new String(bool);
		
		if(s.equals("Q")){
			String op = Cabecalho.readRequestHeader(temp);
			byte[] data = temp.getData();
			
			retorno = this.codec.readRequestBody(op, data);
			
		}else{
			retorno = new Object[1];
			int cont = Cabecalho.readResponseHeader(temp);
			byte[] data = temp.getData();
			
			retorno = this.codec.readResponseBody(data, cont);
		}
		
		
		return retorno;
	}
}
